package com.zjl.学习.第02章_作业对象Job;

import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.StepExecution;
import org.springframework.batch.core.scope.context.ChunkContext;
import org.springframework.batch.core.scope.context.JobContext;
import org.springframework.batch.core.scope.context.JobSynchronizationManager;
import org.springframework.batch.core.scope.context.StepContext;
import org.springframework.batch.item.ExecutionContext;

import java.util.Map;

/**
 * 语文中有个词叫上下文，
 *      比如：联系上下文解读一下作者所有表达意思。
 *          从这看上下文有环境，语境，氛围的意思。
 *          类比到编程，业内也喜欢使用Context表示上下文。
 *          比如Spring容器： SpringApplicationContext 。
 *          有上下文这个铺垫之后，我们来看下Spring Batch的上下文。
 *
 * Spring Batch 有2个比较重要的上下文：
 * ●JobContext 作业上下文
 *  JobContext 绑定 JobExecution 执行对象为Job作业执行提供执行环境(上下文)。
 *  作用：维护 JobExecution 对象，实现作业收尾工作，与处理各种作业回调逻辑。
 * @see org.springframework.batch.core.scope.context.JobContext
 *  public class JobContext extends SynchronizedAttributeAccessor {
 *      private JobExecution jobExecution;
 *      private Map<String, Set<Runnable>> callbacks = new HashMap();
 *      ...
 *  }
 * ●StepContext 步骤上下文
 *  StepContext 绑定 StepExecution 执行对象为Step步骤执行提供执行环境(上下文)。
 *  作用：维护 StepExecution 对象，实现步骤收尾工作，与处理各种步骤回调逻辑
 * @see org.springframework.batch.core.scope.context.StepContext
 *  public class StepContext extends SynchronizedAttributeAccessor {
 *     private StepExecution stepExecution;
 *     private Map<String, Set<Runnable>> callbacks = new HashMap();
 *     private BatchPropertyContext propertyContext = null;
 *     ...
 *  }
 *
 * ●ExecutionContext 执行上下文    F2_作业与步骤执行链.png
 * 除了上面讲的JobContext 作业上下文， StepContext 步骤上线下文外，还有Spring Batch还维护另外一个上下文：
 *      ExecutionContext 执行上下文，作用是：  数据共享
 * Spring Batch 中 ExecutionContext 分2大类
 *      Job ExecutionContext     作用域：一次作业运行，所有Step步骤间数据共享。
 *      Step ExecutionContext：  作用域：一次步骤运行，单个Step步骤间(ItemReader/ItemProcessor/ItemWrite组件间)数据共享。
 * @see org.springframework.batch.item.ExecutionContext
 *
 *
 * 作业与步骤引用链
 *      作业线 Job—JobInstance—JobContext—JobExecution–ExecutionContext
 *      步骤线 Step–StepContext –StepExecution–ExecutionContext
 */
public class F_执行上下文ExecutionContext {
    public static void main(String[] args) {
        作业上下文();

        步骤上下文();

        执行上下文();


    }

    private static void 执行上下文() {
        //执行上下文API
        ChunkContext chunkContext = null;
        //步骤
        StepContext stepContext = chunkContext.getStepContext();
        StepExecution stepExecution = stepContext.getStepExecution();
        ExecutionContext stepExecutionContext = stepExecution.getExecutionContext();
        stepExecutionContext.put("key", "value");
        //-------------------------------------------------------------------------
        //作业
        JobExecution jobExecution = stepExecution.getJobExecution();
        ExecutionContext jobExecutionContext = jobExecution.getExecutionContext();
        jobExecutionContext.put("key", "value");
    }

    private static void 步骤上下文() {
        //步骤上下文API
        ChunkContext chunkContext = null;
        StepContext stepContext = chunkContext.getStepContext();
        StepExecution stepExecution = stepContext.getStepExecution();
        Map<String, Object> stepExecutionContext = stepContext.getStepExecutionContext();
        Map<String, Object> jobExecutionContext = stepContext.getJobExecutionContext();
    }

    private static void 作业上下文() {
        //作业上下文API
        JobContext context = JobSynchronizationManager.getContext();
        JobExecution jobExecution = context.getJobExecution();
        Map<String, Object> jobParameters = context.getJobParameters();
        Map<String, Object> jobExecutionContext = context.getJobExecutionContext();
    }

}
